import wx
from socket import socket, AF_INET, SOCK_STREAM
from threading import Thread
class CharClient(wx.Frame):
    # clientName 窗体名称
    def __init__(self,client_name):
        super().__init__(None, id=wx.ID_ANY, title=f"{client_name}聊天窗口", pos=wx.DefaultPosition, size=(400,600), style=wx.DEFAULT_FRAME_STYLE,
             name="frame")
        self.client_name = client_name
        # 创建面版
        panel = wx.Panel(self)
        # 创建盒子
        box = wx.BoxSizer(wx.VERTICAL)
        '''
        FlexGridSizer(rows, cols, vgap, hgap)
            rows：网格的行数 注意，行不够的话会报错
            cols：网格的列数, 注意，如果列不够的话会报错
            vgap：垂直间距（像素）
            hgap：水平间距（像素）
            创建可伸缩的div
        '''
        flex = wx.FlexGridSizer(rows=1, cols=2, vgap=5, hgap=5)

        # 创建两个按钮
        conn_btn = wx.Button(panel, wx.ID_ANY, "连接", size=(180,50))
        dis_conn_btn = wx.Button(panel, wx.ID_ANY, "断开", size=(180,50))
        # 设置列可伸缩 参数为下标，从0开始
        # flex.AddGrowableCol(0)
        # flex.AddGrowableCol(1)
        # flex.AddGrowableRow(3) 设置行可伸缩 参数为下标，从0开始
        ''' 
            sizer.Add(widget, proportion, flag, border)
                widget：要添加的控件
                proportion：伸缩比例（通常为 0）
                flag：布局标志（如 wx.EXPAND、wx.ALL 等）
                border：边框大小（像素）
            按钮添加到flex中
        '''

        flex.Add(conn_btn, 0, wx.EXPAND, 0)
        flex.Add(dis_conn_btn, 0, wx.EXPAND, 0)
        box.Add(flex, 0, wx.ALIGN_CENTRE, 5)

        # 只读的多行文本
        self.text = wx.TextCtrl(panel, pos=(20, 100), size=(180,200), style=wx.TE_MULTILINE|wx.TE_READONLY)
        box.Add(self.text, 0, wx.EXPAND, 10)


        # 第二个文本框
        self.text2 = wx.TextCtrl(panel, pos=(20, 100), size=(180, 180), style=wx.TE_MULTILINE)
        box.Add(self.text2, 0, wx.EXPAND, 10)


        # 创建一个伸缩框
        flex2 = wx.FlexGridSizer(rows=1, cols=2, vgap=5, hgap=5)
        # 底部两个按钮
        send_btn = wx.Button(panel, wx.ID_ANY, "发送", size=(180,50))
        reset_btn = wx.Button(panel, wx.ID_ANY, "重置", size=(180,50))

        flex2.Add(send_btn, 0, wx.EXPAND, 5)
        flex2.Add(reset_btn, 0, wx.EXPAND, 5)

        box.Add(flex2, 0, wx.ALIGN_CENTRE, 5)


        panel.SetSizer(box)
        #窗口显示，是Show 不是show
        self.Show()


        # 绑定事件。EVT_.BUTTON 是绑定器，它将按钮点击事件关联到 OnClick() 方法。
        conn_btn.Bind(wx.EVT_BUTTON, self.onbutton)

        '''------------------以上为界面， 以下为功能-----------------------'''
        self.isConnected = False
        self.connet_to_server = False
        self.client_name = client_name


    def onbutton(self, event):

        if not self.isConnected :

            self.connet_to_server = socket(AF_INET, SOCK_STREAM)
            self.connet_to_server.connect(("127.0.0.1", 8890))
            self.connet_to_server.send(self.client_name.encode('utf-8'))

            # 创建会话线程
            self.children_thread = Thread(target=self.child_thread)

            # 守护线程
            self.children_thread.daemon = True
            # 修改连接状态
            self.isConnected = True
            # 开启线程
            self.children_thread.start()

    def child_thread(self):
        # 接收服务端返回的内容
        if self.isConnected :
            conn =self.connet_to_server.recv(1024).decode('utf-8')
            print(conn,'===2')
            self.text.AppendText(conn)

if __name__ == '__main__':
    app = wx.App()
    CharClient('客户端李四')
    app.MainLoop()



